"""
建议先准备好金融知识，如何评价一个量化策略
然后再实现评价系统
python要求不高
你的任务是修改analysis函数，对self.Logs做出分析并打印
"""
from Logging import Logs, Log
import numpy as np
def compute_annual_profit(net_value_ratio):               #net_value_ratio是总价值除以初始资本
    annual_profit=pow(net_value_ratio,1/10)-1
    annual_profit=round(annual_profit*100,2)
    return annual_profit

def compute_sharpe_ratio(profit_ratios):
    profit_std = np.std(profit_ratios)
    sharpe_ratio=(np.mean(profit_ratios)-0.0294/250)/(profit_std) #目前十年期国债收益率为2.94%
    sharpe_ratio=round(sharpe_ratio*pow(250,1/2),2)                #计算年化夏普比率,将一年交易日视为250天
    return sharpe_ratio

def compute_drawdown(net_values):
    max_drawdown=0
    index=0
    for net_value in net_values:
        for sub_net_value in net_values[index:]:
            drawdown=1-sub_net_value/net_value
            if drawdown>max_drawdown:
                max_drawdown=drawdown
        index+=1
    max_drawdown=round(max_drawdown*100,2)      #变成百分数后保留两位小数
    return max_drawdown
class Analyzer():
    def __init__(self, Logs):
        self.Logs = Logs #你会得到一个列表，这个列表的元素是Log, Log的定义参考Loggin下的Log

    def analysis(self):
        print("start analyzation")
        net_values = []
        for log in self.Logs:
            net_values.append(log.value)
        net_value_end=net_values[-1]
        net_value_start=net_values[0]
        net_value_ratio=net_value_end/net_value_start
        profit_ratios=[]
        net_value_pre=net_value_start
        for net_value in net_values:
            profit_ratio=net_value/net_value_pre-1
            profit_ratios.append(profit_ratio)
            net_value_pre=net_value
        profit_ratios.pop(0)    #删除第一个元素0
        annual_profit =compute_annual_profit(net_value_ratio)
        sharpe_ratio = compute_sharpe_ratio(profit_ratios)
        max_drawdown = compute_drawdown(net_values)
        print("年收益率为" + str(annual_profit) + "%")
        print("夏普比率为" + str(sharpe_ratio))
        print("最大回撤为" + str(max_drawdown) + "%")
        print("quit analyzation")